/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;

import accesoDatos.Consultas;
import accesoDatos.ParametrosConsulta;
import com.sgd.videoclub.Alquiler;
import com.sgd.videoclub.AlquilerPelicula;
import com.sgd.videoclub.AlquilerPeliculaId;
import com.sgd.videoclub.Pelicula;
import com.sgd.videoclub.Socio;
import com.sgd.videoclub.Videoclub;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.persistence.criteria.CriteriaBuilder;
import javax.servlet.ServletContext;
import javax.validation.constraints.AssertTrue;
import utils.FacesUtils;
import utils.FuncionesGenericas;
import utils.GeneraReporte;

/**
 *
 * @author Ing Daniel Silva
 */
@ManagedBean
@RequestScoped
public class CtrAlquiler {

    //Objetos y Listas:
    Alquiler alquiler = new Alquiler();
    List<Alquiler> lstAlquilers = new ArrayList<>();
    List<Alquiler> lstAlquilersMenu = new ArrayList<>();

    //VideoClubs
    List<Videoclub> lstVideoClub = new ArrayList<>();
    List<SelectItem> lstItemsVideoClub = new ArrayList<>();

    //Variables Utilizadas:
    String txtBuscar = "";
    String opcionEdicion = "";
    String opcionBoton = "";

    //Para la busqueda de Pelicula
    String cod_Pelicula = "";

    //Librerias Herramientas
    Consultas consultas = new Consultas();
    FuncionesGenericas fg = new FuncionesGenericas();
    GeneraReporte gr = new GeneraReporte();

    //SesiÃ²n
    CtrSession ctrSession;

    //Constructor
    public CtrAlquiler() {
        //Cargo SesiÃ²n
        ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");

        //Refresco los datos de la ventana
        cargarDatos();

        //Carga Alquiler en caso que se edite
        cargarAlquiler();
    }

    public void cargarDatos() {
        //Inicializo valores:
        lstAlquilers = consultas.getListHql(null, "Alquiler", "  0=0 order by fechaRecogida DESC, codigo DESC ", null);

        //cargoAlquilersMenu();
        lstVideoClub = consultas.getListHql(null, "Videoclub", null, null);
        lstItemsVideoClub = fg.cargarSelectItems(lstVideoClub, "codigo");

    }

//    public void cargoAlquilersMenu() {
//
//    //Lista de Alquilers que Aparecen en el Menu:
//        List<ParametrosConsulta> lisPar = new ArrayList();
//        lisPar.add(new ParametrosConsulta("usuarioId", ctrSession.getUsuarioLogueado().getId()));
//
//        String sql = " SELECT DISTINCT emp.* "
//                + "    FROM USUARIO us,EMPRESA emp,PROYECTO proy,REQ_PARTICIPACION req "
//                + "    where "
//                + "    req.PROYECTO_ID=proy.ID and proy.EMPRESA_ID=emp.id and emp.USUARIO_ID=us.ID "
//                + "    and req.DESTINATARIO_ID=:usuarioId "
//                + "    and req.ESTADO='ACEPTADO' "
//                + "    and req.INMENU=1 "
//                + "    order by emp.abreviatura "
//                + " ";
//
//        lstAlquilersMenu = consultas.getListSqlClass(sql, Alquiler.class, lisPar);
//
//        //Saco los proyectos de cada alquiler:
//        for (int n=0;n<lstAlquilersMenu.size();n++) {
//
//            List<ParametrosConsulta> lisParProy = new ArrayList<ParametrosConsulta>();
//            lisParProy.add(new ParametrosConsulta("usuarioId", ctrSession.getUsuarioLogueado().getId()));
//            lisParProy.add(new ParametrosConsulta("alquilerId", lstAlquilersMenu.get(n).getId()));
//
//            sql = "  SELECT proy.* FROM USUARIO us,EMPRESA emp,PROYECTO proy,REQ_PARTICIPACION req "
//                    + "where "
//                    + "    req.PROYECTO_ID=proy.ID and proy.EMPRESA_ID=emp.id and emp.USUARIO_ID=us.ID "
//                    + "    and req.DESTINATARIO_ID=:usuarioId "
//                    + "    and req.ESTADO='ACEPTADO' "
//                    + "    and req.INMENU=1 "
//                    + "    and emp.id=:alquilerId "
//                    + "    order by proy.abreviatura ";
//            List<Proyecto> listProyectosMenu = consultas.getListSqlClass(sql, Proyecto.class, lisParProy);
//            lstAlquilersMenu.get(n).setProyectosMenu(listProyectosMenu);
//            
//        }
//
//    }
    public void cargarAlquiler() {
        //Cargo la Alquiler:

        if (!ctrSession.getParametro().isEmpty()) {

            for (Object parametro : ctrSession.getParametro()) {
                parametro.getClass();
                if (parametro.getClass() == alquiler.getClass()) {

                    //Cargar Datos del Socio
                    alquiler = (Alquiler) parametro;

                    //Obtengo el SOcio:
                    ctrSession.setSelSocio(alquiler.getSocio());
                    ctrSession.setAlquilerPeliculas(alquiler.getAlquilerPeliculas());

                    calcularTotales();

                    opcionEdicion = "Editar";

                }
            }

        } else {

            opcionEdicion = "Nuevo";
        }
    }

    //Opciones del Menu del Mantenimiento:
    public void seleccionaOpcion(String opcion) throws IOException {

        String url;
        boolean encontro = false;
        switch (opcion) {
            //Crear un Nuevo Registro
            case "N":
                ctrSession.getParametro().clear();
                ctrSession.getAlquilerPeliculas().clear();
                fg.redireccionar("frmAlquiler");
                ctrSession.setSelSocio(new Socio());
                ctrSession.getListSocios().clear();
                ctrSession.setTotalAlquiler(0);
                break;
            //Editar el registro seleccionado
            case "E":

                //Cargo Entidad
                encontro = false;
                for (Alquiler alquiler : lstAlquilers) {
                    if (alquiler.isSeleccionado()) {
                        this.alquiler = alquiler;
                        ctrSession.getAlquilerPeliculas().clear();
                        ctrSession.getAlquilerPeliculas().addAll(alquiler.getAlquilerPeliculas());
                        encontro = true;
                        break;
                    }
                }

                if (encontro) {
                    //Guardo valor en la Session
                    ctrSession.getParametro().add(alquiler);
                    //Cargo Valores de la Entidad:
                    fg.redireccionar("frmAlquiler");
                }

                break;
            //Borrar el Registro seleccionado
            case "B":

                //Encuentro Entidad Seleccionada
                encontro = false;
                for (Alquiler alquiler : lstAlquilers) {
                    if (alquiler.isSeleccionado()) {
                        this.alquiler = alquiler;
                        encontro = true;
                        break;
                    }
                }

                //Realizo la Eliminacion:
                consultas.eliminar(alquiler);
                cargarDatos();
                break;
        }

    }

    //MÃ¨todo de Registro de Entidad
    public String grabar() {
        int opcion = 1;
        if (alquiler.getCodigo() != 0) {
            opcion = 0;
        } else {
            alquiler.setCodigo(Integer.valueOf(consultas.nextSecuencia("VIDEOCLUB.SEQ_ALQUILER.nextval").toString()));

        }

        //Realizo la ValidaciÃ²n de la Entidad
        if (validacion(alquiler)) {

            //Cargo los valores de la entidad:
//            alquiler.setUsuario(ctrSession.getUsuarioLogueado());
            //Realizo el guardado:
            alquiler.setSocio(ctrSession.getSelSocio());
            alquiler.setTotalPagar(BigDecimal.valueOf(ctrSession.getTotalAlquiler()));
            alquiler.setVideoclub(ctrSession.getSelVideoCLub());

            consultas.guardar(alquiler, opcion);

            if (opcion != 0) {
                for (AlquilerPelicula alpelTemp : ctrSession.getAlquilerPeliculasList()) {
                    alpelTemp.setAlquiler(alquiler);
                    AlquilerPeliculaId idAlPel = new AlquilerPeliculaId(alpelTemp.getPelicula().getCodigo(), alpelTemp.getAlquiler().getCodigo());
                    alpelTemp.setId(idAlPel);
                    consultas.guardar(alpelTemp, 1);
                }
            }

            fg.redireccionar("listAlquilers");
        }
        return "";
    }

    public String definirSocio(Socio socio) {

        ctrSession.setSelSocio(socio);
        alquiler.setSocioNombre(String.valueOf(socio.getNombre()));
        ctrSession.setVerBuscador(false);

        return "";

    }

    //Metodo que realiza la validaciÃ²n de la Entidad:
    public boolean validacion(Alquiler alquiler) {
        boolean exito = true;
        //Valido que los dos password sean los mismos

        //Fecha de Devolucion
        Calendar calDev = Calendar.getInstance();

        int anoDevolucion = 0;
        int mesDevolucion = 0;
        int diaDevolucion = 0;

        if (alquiler.getFechaDevolucion() == null) {
            exito = false;
            fg.mostrarError("Debe seleccionar una fecha de devolucion.");
        } else {
            calDev.setTime(alquiler.getFechaDevolucion());
            anoDevolucion = calDev.get(Calendar.YEAR);
            mesDevolucion = calDev.get(Calendar.MONTH);
            diaDevolucion = calDev.get(Calendar.DAY_OF_MONTH);
        }

        //Fecha de Recogida
        Calendar calRec = Calendar.getInstance();
        int anoRecogida = 0;
        int mesRecogida = 0;
        int diaRecogida = 0;

        if (alquiler.getFechaRecogida() == null) {
            exito = false;
            fg.mostrarError("Debe seleccionar una fecha de recogida.");
        } else {
            calRec.setTime(alquiler.getFechaRecogida());
            anoRecogida = calRec.get(Calendar.YEAR);
            mesRecogida = calRec.get(Calendar.MONTH);
            diaRecogida = calRec.get(Calendar.DAY_OF_MONTH);
        }

        //Fecha de Actial
        Calendar calAct = Calendar.getInstance();
        calRec.setTime(new Date());
        int anoActual = calAct.get(Calendar.YEAR);
        int mesActual = calAct.get(Calendar.MONTH);
        int diaActual = calAct.get(Calendar.DAY_OF_MONTH);

        //Fecha de Devolucion debe ser mayor a la fecha de recogida
        if (anoDevolucion < anoRecogida || (anoDevolucion == anoRecogida && mesDevolucion < mesRecogida) || (anoDevolucion == anoRecogida && mesDevolucion == mesRecogida && diaDevolucion < diaRecogida)) {
            exito = false;
            fg.mostrarError("No se puede grabar. La fecha de devolucion es menor a la fecha de recogida.");
        }

        if (anoDevolucion < (anoActual) || (anoDevolucion == anoActual && mesDevolucion < mesActual) || (anoDevolucion == anoActual && mesDevolucion == mesActual && diaDevolucion < diaActual)) {
            exito = false;
            fg.mostrarError("No se puede grabar. La fecha de devolucion es menor a la fecha actual.");
        }

        if (!opcionEdicion.equalsIgnoreCase("Editar")) {
            if (anoRecogida < (anoActual) || (anoRecogida == anoActual && mesRecogida < mesActual) || (anoRecogida == anoActual && mesRecogida == mesActual && diaRecogida < diaActual)) {
                exito = false;
                fg.mostrarError("No se puede grabar. La fecha de recogida es menor a la fecha actual.");
            }
        }

        if (alquiler.getFechaDevolucion() == null) {
            exito = false;
            fg.mostrarError("Debe especificar la fecha de devolución.");
        }

        if (alquiler.getFechaRecogida() == null) {
            exito = false;
            fg.mostrarError("Debe especificar la fecha de recogida.");
        }
        if (ctrSession.getSelSocio() == null) {

            exito = false;
            fg.mostrarError("Debe especificar un socio.");

        }

        if (ctrSession.getSelSocio() != null) {
            if (ctrSession.getSelSocio().getCodigo() == 0) {
                exito = false;
                fg.mostrarError("Debe especificar un socio.");
            }
        }

        if (ctrSession.getAlquilerPeliculas().size() <= 0) {
            exito = false;
            fg.mostrarError("Debe seleccionar al menos una pelicula.");

        }

//        List lista=consultas.getListSql("select * from alquiler where nombre like '"+alquiler.getNombre().toUpperCase()+"' and cod_videoclub="+alquiler.getSel_VideoClub()+" ");
//        if(lista.size()>0){
//            exito=false;
//            fg.mostrarError("No se puede grabar. La pelÃ­cula ya existe en este videoclub..");
//        }
        return exito;
    }

    //Metodo que realiza la busqueda de Objetos:
    public String buscar() {

        if (!txtBuscar.equals("")) {
            //Defino los campos por los que se realizarÃ  la bÃ¹squeda:
            String where = " upper(usuario.username) like '%" + txtBuscar.toUpperCase() + "%' or"
                    + " upper(nombre) like '%" + txtBuscar.toUpperCase() + "%' or"
                    + " upper(apellido) like '%" + txtBuscar.toUpperCase() + "%' ";
            lstAlquilers = consultas.getListHql(null, "Alquiler", where, null);
        } else {
            listarAlquilers();
        }
        return "";

    }

    public String agregarPelicula() {

        if (cod_Pelicula != null) {
            if (!cod_Pelicula.equalsIgnoreCase("")) {

                List lstPel = consultas.getListHql(null, "Pelicula", " codigo=" + cod_Pelicula + " ", null);

                if (lstPel.size() > 0) {
                    Pelicula peliculaSeleccionada = (Pelicula) lstPel.get(0);
                    AlquilerPelicula ap = new AlquilerPelicula();
                    ap.setPrecio(peliculaSeleccionada.getPrecioAlquiler());
                    ap.setPelicula(peliculaSeleccionada);
                    ap.setAlquiler(alquiler);

                    //Recorro el vector para ver si ya se encuentra la pelicula si ya se encuentra en la lista
                    boolean encontro = false;
                    for (AlquilerPelicula al : ctrSession.getAlquilerPeliculasList()) {
                        if (al.getPelicula().getCodigo() == ap.getPelicula().getCodigo() && al.getAlquiler().getCodigo() == ap.getAlquiler().getCodigo()) {

                            al.setCantidad(al.getCantidad() + 1);

                            encontro = true;
                        }
                    }

                    if (!encontro) {
                        ap.setCantidad(1);
                        alquiler.getAlquilerPeliculas().add(ap);
                        ctrSession.getAlquilerPeliculas().add(ap);
                    }

                    calcularTotales();

                }

            }
        }

        return "";

    }

    //Metodo Utilizado para Calcular los totales
    public void calcularTotales() {

        try {

            //Recalculo los totales
            for (AlquilerPelicula al : ctrSession.getAlquilerPeliculasList()) {
                //Recalculo el subtotal
                String cantidadT = String.valueOf(al.getCantidad());
                String precioT = String.valueOf(al.getPrecio());
                if (!cantidadT.equals("null")) {
                    double cantidad = Double.valueOf(cantidadT);
                    double precio = Double.valueOf(precioT);
                    al.setSubtotal(BigDecimal.valueOf(cantidad * precio));
                }

            }

            //Calcular Total
            double total = 0;
            for (AlquilerPelicula al : ctrSession.getAlquilerPeliculasList()) {
                String subtotalT = String.valueOf(al.getSubtotal());
                double subtotal = Double.valueOf(subtotalT);
                total = total + subtotal;
            }
            ctrSession.setTotalAlquiler(round(total, 2));

        } catch (Exception e) {

        }

    }

    public static double round(double value, int places) {
        if (places < 0) {
            throw new IllegalArgumentException();
        }

        long factor = (long) Math.pow(10, places);
        value = value * factor;
        long tmp = Math.round(value);
        return (double) tmp / factor;
    }

    public String eliminarPelicula(AlquilerPelicula apelTemp) {

        List<AlquilerPelicula> listAlquilerPelQuitar = new ArrayList<>();

        boolean encontro = false;
        if (ctrSession.getAlquilerPeliculasList() != null) {
            for (AlquilerPelicula al : ctrSession.getAlquilerPeliculasList()) {
                if (al.getPelicula().getCodigo() == apelTemp.getPelicula().getCodigo() && al.getAlquiler().getCodigo() == apelTemp.getAlquiler().getCodigo()) {

                    al.setCantidad(al.getCantidad() - 1);

                    if (al.getCantidad() == 0) {
                        listAlquilerPelQuitar.add(al);

                    }

                    encontro = true;
                }
            }
        }

        //Quito los detalles borrados
        ctrSession.getAlquilerPeliculas().removeAll(listAlquilerPelQuitar);

        calcularTotales();

        return "";
    }

    public void buscarSocio() {

        List listSocios = consultas.getListHql(null, "Socio", " nombre like '%" + ctrSession.getTxtbuscar().toUpperCase() + "%' order by nombre ", null);
        if (listSocios != null) {
            if (listSocios.size() == 1) {
                Socio socio = (Socio) listSocios.get(0);

                ctrSession.setSelSocio(socio);
                ctrSession.setTxtbuscar(String.valueOf(socio.getCodigo()));
                alquiler.setSocioNombre(socio.getNombre());
            }
        }

        ctrSession.getListSocios().clear();
        ctrSession.getListSocios().addAll(listSocios);

    }

    public void verBuscar() {
        ctrSession.setVerBuscador(true);

    }

    public void cerrarBuscador() {
        ctrSession.setVerBuscador(false);

    }

    //Listado de Alquilers
    public void listarAlquilers() {
        lstAlquilers = consultas.getListHql(null, "Alquiler", "  0=0 order by fechaRecogida DESC, codigo DESC ", null);
    }

    //Metodo que Redirecciona a la Pagina de Listados:
    public String irListado() {
        fg.redireccionar("listAlquilers");
        return "";
    }

    //Metodo de Refrescamiento de Pagina:
    public String refrescar() {
        return "";
    }

    //Metodo que Realiza la Impresion de Listados
    public void imprimir() {
        gr.generaPdfListado(lstAlquilers, "alquilers", Alquiler.class, new HashMap(), "listaalquilers");
    }

    //POJOS UTILIZADOS:
    public Alquiler getAlquiler() {
        return alquiler;
    }

    public void setAlquiler(Alquiler alquiler) {
        this.alquiler = alquiler;
    }

    public List<Alquiler> getLstAlquilers() {
        return lstAlquilers;
    }

    public void setLstAlquilers(List<Alquiler> lstAlquilers) {
        this.lstAlquilers = lstAlquilers;
    }

    public List<Alquiler> getLstAlquilersMenu() {
        return lstAlquilersMenu;
    }

    public void setLstAlquilersMenu(List<Alquiler> lstAlquilersMenu) {
        this.lstAlquilersMenu = lstAlquilersMenu;
    }

    public String getTxtBuscar() {
        return txtBuscar;
    }

    public void setTxtBuscar(String txtBuscar) {
        this.txtBuscar = txtBuscar;
    }

    public String getOpcionEdicion() {
        return opcionEdicion;
    }

    public void setOpcionEdicion(String opcionEdicion) {
        this.opcionEdicion = opcionEdicion;
    }

    public String getOpcionBoton() {

        if (opcionEdicion.startsWith("Nue")) {
            opcionBoton = "Crear";
        }
        if (opcionEdicion.startsWith("Edi")) {
            opcionBoton = "Actualizar";
        }

        return opcionBoton;
    }

    public void setOpcionBoton(String opcionBoton) {
        this.opcionBoton = opcionBoton;
    }

    public List<SelectItem> getLstItemsVideoClub() {
        return lstItemsVideoClub;
    }

    public void setLstItemsVideoClub(List<SelectItem> lstItemsVideoClub) {
        this.lstItemsVideoClub = lstItemsVideoClub;
    }

    public String getCod_Pelicula() {
        return cod_Pelicula;
    }

    public void setCod_Pelicula(String cod_Pelicula) {
        this.cod_Pelicula = cod_Pelicula;
    }

}
